package com.google.code.jarquivoretorno.core;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import com.google.code.jarquivoretorno.core.exc.EstruturaError;
import com.google.code.jarquivoretorno.core.exc.IError;
import com.google.code.jarquivoretorno.layout.LayoutFactory;
import com.google.code.jarquivoretorno.layout.LayoutFile;
import com.google.code.jarquivoretorno.layout.modelo.Layout;
import com.google.code.jarquivoretorno.ret.ArquivoRetorno;

/**
 * 
 * @author Rafael Freitas de Morais
 * 
 */
class ManipuladorArquivo {

	private List<ArquivoRetorno> arquivos = new ArrayList<ArquivoRetorno>();
	private Layout layout = new Layout();
	private List<IError> errors = new ArrayList<IError>();

	public ManipuladorArquivo() {

	}
	
	public void loadArquivo(byte[] dadosArq) {
		StringBuilder arquivo = new StringBuilder();
		for (int i = 0; i < dadosArq.length; i++) {
			arquivo.append((char)dadosArq[i]);
		}
		
		ArquivoRetorno arquivoRetorno = new ArquivoRetorno("ArqBytes", arquivo);
		arquivos.add(arquivoRetorno);
	}

	public void loadArquivo(String path) {
		try {
			BufferedReader input = new BufferedReader(new FileReader(path));
			String nomeArquivo = getNomeArquivo(path);
			StringBuilder arquivo = new StringBuilder();
			try {
				String line = null;
				int i = 1;
				while ((line = input.readLine()) != null) {
					if(line.length() != layout.getTamanhoRegistro()) {
						errors.add(EstruturaError.TAMANHO_LINHA_INCORRETO);
						break;
					}
					arquivo.append(line);
					arquivo.append(System.getProperty("line.separator"));
					i++;
				}
			} finally {
				input.close();
			}
			ArquivoRetorno arquivoRetorno = new ArquivoRetorno(nomeArquivo, arquivo);
			arquivos.add(arquivoRetorno);
		} catch (IOException e) {
			errors.add(EstruturaError.ARQUIVO_NAO_EXISTE);
		}
	}

	public void loadLayout(InputStream file) {
		try {
			layout = LayoutFactory.newLayout(file);
		} catch (IOException e) {
			errors.add(EstruturaError.ARQUIVO_NAO_EXISTE);
		}
	}
	
	public void loadLayout(LayoutFile layoutFile) {
		try {
			InputStream lay = getClass().getResourceAsStream(layoutFile.getDesc());
			layout = LayoutFactory.newLayout(lay);
		} catch (IOException e) {
			errors.add(EstruturaError.ARQUIVO_NAO_EXISTE);
		}
	}

	public Layout getLayout() {
		return layout;
	}

	public List<IError> getErrors() {
		return errors;
	}

	public List<ArquivoRetorno> getArquivos() {
		return arquivos;
	}
	
	private String getNomeArquivo(String path) {
		return path.substring(path.lastIndexOf(System.getProperty("file.separator")) + 1);
	}

}